package com.air.service.impl;


import com.air.constant.MessageConstant;
import com.air.dto.AirLineDTO;
import com.air.dto.AirLineLoginDTO;
import com.air.dto.AirLinePageQueryDTO;
import com.air.entity.AirLine;
import com.air.exception.AccountNotFoundException;
import com.air.exception.PasswordErrorException;
import com.air.mapper.AirLineMapper;
import com.air.result.PageResult;
import com.air.service.AirLineService;
import com.air.vo.AirLineVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AirLineServiceImpl implements AirLineService {

    @Autowired
    private AirLineMapper airLineMapper; //自动注入


    /**
     * 航空公司注册。
     *
     * 该方法接收一个AirLineDTO对象，将其转换为AirLine对象后保存到数据库。
     * 在保存前，会为AirLine对象设置一个默认密码。
     *
     * @param airLineDTO 注册信息的数据传输对象，包含航空公司名称等信息。
     */
    @Override
    public void save(AirLineDTO airLineDTO) {
        // 输出当前执行线程的ID，用于调试和日志记录
        System.out.println("当前线程的id"+Thread.currentThread().getId());

        // 创建一个新的AirLine对象，用于存储注册信息
        AirLine airLine = new AirLine();
        // 将AirLineDTO对象的属性复制到AirLine对象中
        BeanUtils.copyProperties(airLineDTO, airLine);
        // 为AirLine对象设置一个默认密码
        airLine.setPassword("123456");
        // 将AirLine对象插入到数据库中
        airLineMapper.insert(airLine);
    }


    /**
     * 航空公司登录方法
     * 通过提供的用户名和密码验证用户身份，并返回登录成功的用户信息。
     *
     * @param airLineLoginDTO 登录信息数据传输对象，包含用户名和密码。
     * @return 登录成功返回用户信息，是一个AirLine实例。
     * @throws AccountNotFoundException 如果用户名不存在，则抛出此异常。
     * @throws PasswordErrorException 如果密码不正确，则抛出此异常。
     */
    @Override
    public AirLine login(AirLineLoginDTO airLineLoginDTO) {
        // 从登录DTO中提取用户名和密码
        String username = airLineLoginDTO.getUsername();
        String password = airLineLoginDTO.getPassword();

        // 根据用户名查询数据库中的用户信息
        AirLine airLine = airLineMapper.getByUsername(username);

        // 验证用户名是否存在
        if (airLine == null) {
            // 如果用户不存在，则抛出账户未找到异常
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        // 验证密码是否正确
        if (!password.equals(airLine.getPassword())) {
            // 如果密码不正确，则抛出密码错误异常
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        // 用户名和密码验证通过，返回用户信息
        return airLine;
    }


    /**
     * 航空公司分页查询接口实现。
     *
     * 该方法通过接收一个航空公司分页查询条件的数据传输对象（DTO），来实现对航空公司的分页查询。
     * 使用PageHelper进行分页处理，然后调用airLineMapper的pageQuery方法进行查询，
     * 最后返回查询结果的分页信息。
     *
     * @param airLinePageQueryDTO 分页查询条件的DTO，包含页码和每页大小等信息。
     * @return 返回分页查询结果，包含总记录数和查询到的航空公司信息列表。
     */
    @Override
    public PageResult pageQuery(AirLinePageQueryDTO airLinePageQueryDTO) {
        // 初始化分页插件，根据传入的页码和每页大小进行分页。
        PageHelper.startPage(airLinePageQueryDTO.getPage(), airLinePageQueryDTO.getPageSize());
        // 调用Mapper进行分页查询，返回分页后的航空公司信息。
        Page<AirLineVO> page = airLineMapper.pageQuery(airLinePageQueryDTO);
        // 构造并返回分页结果对象，包含总记录数和查询到的航空公司信息列表。
        return new PageResult(page.getTotal(), page.getResult());
    }


    /**
     * 根据指定的ID获取航空公司的详细信息。
     *

     * 它通过调用airLineMapper的getById方法，使用提供的ID来查询数据库，并返回对应的航空公司信息。
     * 如果找不到匹配的航空公司信息，则返回null。
     *
     * @param id 航空公司的唯一标识符。
     * @return 匹配指定ID的航空公司信息对象。如果找不到，则返回null。
     */
    @Override
    public AirLineVO getById(Long id) {
        AirLineVO airLine = airLineMapper.getById(id);
        return airLine;
    }

    /**
     * 更新航空公司的信息。
     *
     * 该方法通过接收一个AirLineDTO对象，将其属性值复制到一个新的AirLine对象中，
     * 然后使用AirLineMapper来更新数据库中的航空公司信息。这种方法避免了直接操作数据库，
     * 而是利用了数据访问对象（DAO）模式来实现数据的更新，提高了代码的可维护性和可扩展性。
     *
     * @param airLineDTO 包含待更新航空公司信息的数据传输对象。
     */
    @Override
    public void update(AirLineDTO airLineDTO) {
        // 创建一个新的AirLine对象，用于存储待更新的航空公司信息。
        AirLine airLine = new AirLine();
        // 使用BeanUtils的copyProperties方法，将airLineDTO的属性值复制到airLine对象中。
        BeanUtils.copyProperties(airLineDTO, airLine);
        // 调用AirLineMapper的update方法，更新数据库中的航空公司信息。
        airLineMapper.update(airLine);
    }

}
